home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
data
/
maglrex
/
pixel.asm
< prev
next >
Wrap
Assembly Source File
|
1991-10-18
|
11KB
|
595 lines
;
; 'Magl.rex' for FM-TOWNS
;
; - MAKIchan Graphic loader is not 鮪だ! -
;
; programmed by MALOR
;
.386p
HeaderSize equ 32/4
Plane2 equ 0104h
Plane1 equ 010ch
CODE segment dword public use32 'CODE'
assume cs:CODE,ds:DATA
;void start(void)
public start
start proc near
call load
ret
start endp
;int inpb(int addr)
public inpb
db 'inpb',4
inpb proc near
xor eax,eax
mov dx,[esp+4]
in al,dx
ret
inpb endp
;void outpb(int addr,int dat)
public outpb
db 'outpb',5
outpb proc near
mov dx,[esp+4]
mov al,[esp+8]
out dx,al
ret
outpb endp
;****************************************
; mag format pixel decode
;****************************************
;int mag(char *maghead,int mode,int offset,int xpixel);
flgdec macro flg_bit ;flag decode macro
local Then
local Endif
rol dl,1
jnc short Then
lodsb ;read flag b to al
;flag b pointer(esi) incliment
jmp short Endif
align 4
Then: xor al,al ;write 0 to flag
Endif: stosb ;write al to es:[edi]
;flag pointer(edi) incliment
endm
public mag
db 'mag',3
align 4
mag proc near
pushad ;汎用レジスタ全部push
mov eax,ss:[esp+36+4] ;mode
mov ds:[Mode],eax
mov eax,ss:[esp+36+8] ;VRAMオフセット
mov ds:[Vofs],eax
mov eax,ss:[esp+36+12] ;横方向のループ回数
mov ds:[Xloopc],ax
mov esi,ss:[esp+36+0] ;ヘッダをコピー
cld ;メモリ転送はインクリメント方向
push es
mov ax,ds ;dsをesにコピー
mov es,ax
mov edi,offset Header
mov ecx,HeaderSize
rep movsd
;flag a,b decode
mov ebp,ds:[flga] ;*ebp=flga
mov esi,ds:[flgb] ;*esi=flgb
mov edi,ds:[flg ] ;*edi=flg
movzx edx,ds:[RY] ;Y方向のループ回数セット
sub dx,ds:[LY]
inc edx
mov ds:[YLoopc],dx ;ワークにセット
movzx eax,ds:[XLoopc] ;X方向のループ回数セット
mul edx ;eax = eax * edx;edx broken
mov ebx,eax
mov ecx,eax ;Loop counter (ecx) set
shr ecx,3 ;ecx = ecx / 8
jz LOOP2_Exit
align 4
LOOP2: mov dl,ds:[ebp]
flgdec ;展開じゃ展開じゃ!
flgdec
flgdec
flgdec
flgdec
flgdec
flgdec
flgdec
inc ebp
dec ecx
jnz LOOP2
LOOP2_Exit:
mov dl,ds:[ebp]
and ebx,7h
jmp ds:[ebx*4+Jtable2]
align 4
jt27: flgdec
jt26: flgdec
jt25: flgdec
jt24: flgdec
jt23: flgdec
jt22: flgdec
jt21: flgdec
jt20:
; 1 line xor
mov esi,ds:[flg] ;esi = 1ライン上のポインタ
mov edi,esi ;edi = フラグのポインタ
movzx ecx,ds:[XLoopc] ;ecx = *XLoopc
add edi,ecx ;edi = esi + *XLoopc
movzx eax,ds:[RY]
sub ax,ds:[LY] ;eax = ry - ly
mul ecx ;eax *= ecx ;edx broken
mov ecx,eax ;ecx = Loop counter
mov ebx,eax
shr ecx,2
jz LOOP1_Exit
align 4
LOOP1: lodsd
xor ds:[edi],eax
add edi,4
loop LOOP1
LOOP1_Exit:
and ebx,3
jmp ds:[ebx*4+Jtable1]
align 4
jt13: lodsb
xor ds:[edi],al
inc edi
jt12: lodsb
xor ds:[edi],al
inc edi
jt11: lodsb
xor ds:[edi],al
jt10:
movzx ecx,ds:[LX] ;左端のVRAMオフセット計算
mov bl,ds:[Screen]
and bl,80h
jnz short ThenA
shr ecx,3
shl ecx,2 ;ecx = (ecx/8)*4
jmp short EndifA
ThenA: shr ecx,2
shl ecx,2 ;ecx = (ecx/4)*4
EndifA: add ds:[Vofs],ecx ;水平方向誤差修正
mov eax,ds:[Lineofs]
movzx ecx,ds:[LY]
mul ecx ;eax = LY * Lineofs ;edx broken
add ds:[Vofs],eax ;垂直方向誤差修正
mov edi,ds:[Vofs] ;edi = VRAMのポインタ
mov ax,Plane1
mov bl,ds:[Screen]
and bl,80h
jnz Mode8 ;256色展開
;pixel decode (16色モード)
Mode4: mov ax,Plane2
mov es,ax ;VRAMセレクタセット
xor ebx,ebx ;関係レジスタ初期化
xor edx,edx
mov esi,ds:[flg] ;esi = フラグのポインタ
mov ebp,ds:[pix] ;ebp = ピクセルのポインタ
mov ax,ds:[YLoopc] ;Y方向のループ回数セット
shl eax,16 ;Y loop counter=eaxの上位16bit
align 4
LOOPY2: mov cx,ds:[XLoopc] ;cx set
;左ピクセル展開
align 4
LOOPX2: mov dl,ds:[esi] ;flag read
shr dl,4
jz short Then3
mov ebx,ds:[edx*4+Mofs] ;前方参照
mov ax,es:[edi+ebx] ;VRAM read to ax
jmp short Endif3
align 4
Then3: mov ax,ds:[ebp] ;pixel read to ax
add ebp,2
ror al,4 ;上位下位4ビット交換
ror ah,4
Endif3: stosw ;VRAM write from ax
;VRAM pointer(edi) incliment
;右ピクセル展開
mov dl,ds:[esi] ;flag read
and dl,0fh
jz short Then4
mov ebx,ds:[edx*4+Mofs] ;前方参照
mov ax,es:[edi+ebx] ;VRAM read to ax
jmp short Endif4
align 4
Then4: mov ax,ds:[ebp] ;pixel read to ax
add ebp,2 ;pixel incliment
ror al,4 ;上位下位4ビット交換
ror ah,4
Endif4: stosw ;VRAM write from ax
;VRAM pointer(edi) incliment
inc esi ;Flag incliment
loop LOOPX2
mov edi,ds:[Vofs] ;ediに1ライン分のオフセット加算
add edi,ds:[Lineofs]
mov ds:[Vofs],edi
xor ax,ax ;ax clear for eax decliment
sub eax,10000h
jnz LOOPY2
jmp Exit
;pixel decode (256色モード)
Mode8: mov es,ax ;VRAMセレクタセット
xor eax,eax ;関係レジスタ初期化
xor ebx,ebx
xor edx,edx
mov ebp,ds:[flg] ;ebp = フラグのポインタ
mov esi,ds:[pix] ;esi = ピクセルのポインタ
mov dx,ds:[YLoopc] ;Y方向のループ回数セット
;Y loop counter=dx
align 4
LOOPY3: mov cx,ds:[XLoopc] ;cx set
;左ピクセル展開
align 4
LOOPX3: mov al,ds:[ebp] ;flag read
shr al,4
jz short Then5
mov ebx,ds:[eax*4+Mofs] ;前方参照
mov ax,es:[edi+ebx] ;VRAM read to ax
jmp short Endif5
align 4
Then5: lodsw ;pixel read to ax
;pixel pointer(esi) incliment
Endif5: stosw ;VRAM write from ax
;VRAM pointer(edi) incliment
xor eax,eax
;右ピクセル展開
mov al,ds:[ebp] ;flag read
and al,0fh
jz short Then6
mov ebx,ds:[eax*4+Mofs] ;前方参照
mov ax,es:[edi+ebx] ;VRAM read to ax
jmp short Endif6
align 4
Then6: lodsw ;pixel read to ax
;pixel pointer(esi) incliment
Endif6: stosw ;VRAM write from ax
;VRAM pointer(edi) incliment
xor eax,eax
inc ebp ;Flag incliment
loop LOOPX3
mov edi,ds:[Vofs] ;ediに1ライン分のオフセット加算
add edi,ds:[Lineofs]
mov ds:[Vofs],edi
sub dx,1
jnz LOOPY3
Exit: pop es
popad ;汎用レジスタ全部pop
ret
mag endp
;****************************************
; maki format pixel decode
;****************************************
mkiflg macro
local Endif1
local Endif2
rol dl,1 ;Carry Flagに抽出
jnc short Endif1 ;CF == 0 : jmp Endif
lodsw ;Read from flag b to ax
;flag b pointer(esi)incliment
mov bx,ax
and ax,0f0f0h
shl bx,4
and bx,0f0f0h
mov ds:[edi],al ;write to Flag
mov ds:[edi+40],bl
mov ds:[edi+80],ah
mov ds:[edi+120],bh
Endif1: rol dl,1
jnc short Endif2
lodsw
mov bx,ax
shr ax,4
and ax,0f0fh
and bx,0f0fh
or ds:[edi],al
or ds:[edi+40],bl
or ds:[edi+80],ah
or ds:[edi+120],bh
Endif2: inc edi
endm
mkipix macro
local Then
local Endif
rol dl,1 ;Carry flagに抽出
jc short Then ;CF == 1 : jmp Then
xor al,al ;write 0 to pix
jmp short Endif
align 4
Then: lodsb ;read from pix to al
;pix pointer(esi) incliment
ror al,4 ;上位下位交換
Endif: stosb ;write al to VRAM(es:[edi])
endm
;int mki(char *mkihead,int mode,int offset);
public mki
db 'mki',3
align 4
mki proc near
pushad
mov eax,ss:[esp+36+4] ;mode
mov ds:[Mode],eax
mov eax,ss:[esp+36+8] ;VRAMオフセット
mov ds:[Vofs],eax
mov eax,ss:[esp+36+0] ;ヘッダ先頭アドレス
mov ds:[SizA],eax ;SizAが代わりのワーク
cld ;flag clear
mov ecx,4000
mov edi,ds:[flg]
xor eax,eax
rep stosd
;flag a,b decode
mov ecx,100 ;ecx = Y loop counter
mov edi,ds:[flg] ;edi = flag pointer
mov esi,ds:[flgb] ;esi = flag b pointer
mov ebp,ds:[flga] ;ebp = flag a pointer
align 4
LOOPY5: mov dh,10 ;dh = X loop counter
align 4
LOOPX5: mov dl,ds:[ebp] ;dl = flag a
mkiflg
mkiflg
mkiflg
mkiflg
inc ebp ;flag a pointer(ebp) incliment
dec dh ;X loop counter decliment
jnz LOOPX5
add edi,40*3 ;1 line offset
sub ecx,1 ;Y loop counter decliment
jnz LOOPY5
;pixel decode
;1024*512画面モード
align 4
Pix1: mov ax,Plane2 ;VRAM selecter set to es
mov es,ax
mov edi,ds:[Vofs] ;es:[edi] = VRAM pointer
mov esi,ds:[pix] ;esi = pix pointer
mov ebp,ds:[flg] ;ebp = Flag pointer
xor eax,eax ;eax clear
mov ebx,400 ;Y loop counter = ebx
align 4
LOOPY6: mov ecx,40
align 4
LOOPX6: mov dl,ds:[ebp]
mkipix
mkipix
mkipix
mkipix
mkipix
mkipix
mkipix
mkipix
inc ebp
dec ecx
jnz LOOPX6
add edi,192
dec ebx
jnz LOOPY6
mov esi,ds:[Vofs] ; 1 Line Xor
mov edi,esi
mov eax,ds:[SizA]
mov al,ds:[eax+6]
cmp al,'A'
je Then9
cmp al,'B'
jne Exit2
add edi,512*4 ; 4 Line 毎
mov ebx,396
jmp Endif9
Then9: add edi,512*2 ; 2 Line 毎
mov ebx,398
Endif9:
align 4
LOOPY7: mov ecx,80
align 4
LOOPX7: mov eax,es:[esi]
xor es:[edi],eax
add esi,4
add edi,4
loop LOOPX7
add esi,192
add edi,192
dec ebx
jnz LOOPY7
Exit2: mov ax,ds
mov es,ax
popad
ret
mki endp
CODE ends
DATA segment dword
assume ds:DATA
align 4
;前方参照オフセットアドレステーブル
Mofs dd -(512*0+0),-(512*0+2),-(512*0+4),-(512*0+8)
dd -(512*1+0),-(512*1+2)
dd -(512*2+0),-(512*2+2),-(512*2+4)
dd -(512*4+0),-(512*4+2),-(512*4+4)
dd -(512*8+0),-(512*8+2),-(512*8+4)
dd -(512*16+0)
;1ライン分のオフセット
Lineofs dd 512
align 4
; header
Header db 0 ;ヘッダの先頭
Machine db 0 ;機種コード
Rflg db 0 ;機種依存フラグ
Screen db 0 ;スクリーンモード
LX dw 0 ;表示開始位置X
LY dw 0 ;表示開始位置Y
RX dw 639 ;表示終了位置X
RY dw 399 ;表示終了位置Y
OffA dd 0 ;フラグAのオフセット
OffB dd 0 ;フラグBのオフセット
SizB dd 0 ;フラグBのサイズ
OffP dd 0 ;ピクセルのオフセット
SizP dd 0 ;ピクセルのサイズ
;Other work
SizA dd 0 ;フラグAのサイズ
;Temporary work
XLoopc dw 0 ;X方向のループ回数
YLoopc dw 0 ;Y方向のループ回数
Vofs dd 0 ;展開領域の左端のVRAMオフセット
Mode dd 4 ;画面モード == 4 : 16色1024*512モード
; == 8 : 256色1024*512モード
; == 1 : DOS互換640*400モード
Sofs dd 0 ;展開元領域の左端オフセット
Slofs dd 0 ;
Vlofs dd 0 ;
;Table
align 4
;xorループの出口のジャンプテーブル
Jtable1 dd offset jt10,offset jt11, offset jt12,offset jt13
;flag decode ループの出口のジャンプテーブル
Jtable2 dd offset jt20,offset jt21,offset jt22,offset jt23
dd offset jt24,offset jt25,offset jt26,offset jt27
DATA ends
public Mofs
public Lineofs
extrn flga:dword
extrn flgb:dword
extrn flg:dword
extrn pix:dword
extrn vram:dword
extrn screen_mode:byte
extrn load:near
end start